package app.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import app.entity.Pager;
import siotwx.dao.NewmateDao;
import siotwx.dao.OrganizationDao;
import siotwx.dao.UserDao;
import siotwx.entity.Newmate;
import siotwx.entity.Organization;
import siotwx.entity.User;
/**
 * 
 * @author 周超 2018年3月9日 
 *
 */
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
@Service("UnitService")
public class UnitService {
	
	//单位的持久化层
	@Autowired
	@Qualifier("OrganizationDao")
	private OrganizationDao orgDao;
	
	//人员持久化层
	@Autowired
	@Qualifier("UserDao")
	private UserDao userDao;
	
	@Autowired
	@Qualifier("NewmateDao")
	private NewmateDao newmateDao;
	
	//获取单位数量
	/**
	 * 该方法用来返回系统中的单位总数量
	 * 
	 * @return 返回一个整形的的系统中的单位数量
	 */
	@Transactional(readOnly=true)
	public Integer getCount(){
		Integer count = orgDao.count(new HashMap<String,Object>(){{
			put(Organization.FieldName.status.toString(), "");
		}});
		return count;
	}
	
	/**
	 * 该方法用来获取系统中的全部单位
	 * 
	 * @return 返回一个整形的的系统中单位列表
	 */
	@Transactional(readOnly=true)
	public List<Organization> getOrgs(){
		return orgDao.getlist(new HashMap<String,Object>(){{
			put(Organization.FieldName.status.toString(), "");
		}});
	}
	
	/**
	 * 该方法用来获取系统中指定区域的全部单位
	 * 
	 * @return 返回一个整形的的系统中单位列表
	 */
	@Transactional(readOnly=true)
	public List<Organization> getOrgs(Integer regionID,Pager pager){
		return orgDao.getlist(new HashMap<String,Object>(){{
			put(Organization.FieldName.region_id.toString(), regionID);
			put(Organization.FieldName.status.toString(), "");
			put("pager", pager);
		}});
	}
	
	
	/**
	 * 该方法用来返回指定地区的单位数量
	 * 
	 * @param regionID 地区编号
	 * @return 返回指定地区的单位数量
	 */
	@Transactional(readOnly=true)
	public Integer getCount(Integer regionID){
		return orgDao.count(new HashMap<String,Object>(){{
			put(Organization.FieldName.region_id.toString(), regionID);
			put(Organization.FieldName.status.toString(), "");
		}});
	}
	
	/**
	 * 该方法用来返回用户通过单位id指定的单位信息
	 * 
	 * @param orgID 单位ID值
	 * @return 返回指定的单位
	 */
	@Transactional(readOnly=true)
	public Organization get(Integer orgID){
		return orgDao.get(orgID);
	}
	
	/**
	 * 该方法用来获取指定单位的全部员工的信息
	 * 
	 * @param orgID 单位ID值
	 * @return 返回指定单位的全部员工信息
	 */
	@Transactional(readOnly=true)
	public List<User> getUsers(Integer orgID ,Pager pager){
		return userDao.getlist(new HashMap<String,Object>(){{
			put(User.FieldName.frozen.toString(), "0");
			put(User.FieldName.organization_id.toString(), orgID);
			put("pager", pager);
		}});
	}
	@Transactional(readOnly=true)
	public Integer getUserCount(Integer orgID){
		return userDao.count(new HashMap<String,Object>(){{
			put(User.FieldName.frozen.toString(), "0");
			put(User.FieldName.organization_id.toString(), orgID);
		}});
	}
	
	/**
	 * 该方法用来将同意将用户添加到预定单位
	 * 
	 * @param userID 要执行添加该用户到单位的用户id
	 * @return 返回受影响的条目数
	 */
	@Transactional(readOnly=false)
	public Integer addTo(Integer userID){
		User user = userDao.get(userID);
		user.setFrozen("0");
		return userDao.update(user);
	}
	
	/**
	 * 该方法用来将指定用户切换到指定单位
	 * 
	 * @param userID 用户id
	 * @param orgID 目的单位id
	 * @return
	 */
	@Transactional(readOnly=false)
	public Integer changUnit(Integer userID,Integer orgID){
		User user = userDao.get(userID);
		user.setOrganization_id(orgID);
		return userDao.update(user);
	}
	
	/**
	 * 软删除指定的单位
	 * 
	 * @param orgID 单位id
	 * @return 返回受影响的单位数目
	 */
	@Transactional(readOnly=false)
	public Integer delUnit(Integer orgID){
		Organization organization = orgDao.get(orgID);
		organization.setStatus("1");
		return orgDao.update(organization);
	}
	
	/**
	 * 软删除指定用户
	 * 
	 * @param userID 用户指定id
	 * @return 返回受影响条目
	 */
	@Transactional(readOnly=false)
	public int delUser(Integer userID){
		User user = userDao.get(userID);
		user.setFrozen("1");
		return userDao.update(user);
	}
	
	@Transactional(readOnly=false)
	public int addUnit(String name,String cname,String tel,String address,String email,Integer region_id){
		
		Integer insert = orgDao.insert(new Organization(0,
				  region_id,
				  tel,
				  name,
				  "",
				  "",
				  cname,
				  "",
				  tel,
				  email,
				  address,
				  "",
				  "",
				  "",
				  "",
				  "",
				  "",
				  "",
				  0L,
				  0L,
				  "",
				  ""));
		return insert;
	}
	//获取所有要进行审核添加到预定公司的用户（人员）
	@Transactional(readOnly=true)
	public List<Newmate> getApplyers(Integer region,Pager pager,Integer comID){
		Map<String, Object> params=new HashMap<>();
		params.put(Newmate.FieldName.regId.toString(), region);
		params.put("pager", pager);
		if (comID!=null&&comID!=0) {
			params.put(Newmate.FieldName.orgId.toString(), comID);
		}
		List<Newmate> getlist = newmateDao.getlist(params);
		return getlist;
	}
	
}






















